#ifndef __OS_TASK_TIMER_H__
#define __OS_TASK_TIMER_H__

#include "stm32l4xx_hal.h"

// 定义任务队列大小
#define TASK_TIMER_SIZE (10)
// 定义任务ID
#define TASK_TIMER_ID_MAX
// 定义任务事件单位，默认时间和系统tick保持一致
#define TASK_TICK_INTERVAL (1)
// 定义任务定时器类型
typedef void (*func_t)(uint8_t *param_in);
// 定义任务定时器类型枚举
enum task_timer_type {
    TASK_TIMER_TYPE_PERIOD, // 周期性定时器
    TASK_TIMER_TYPE_ONE_TIME, // 单次定时器
    TASK_TIMER_TYPE_MAX,
};

// 定义任务定时器结果枚举
enum os_task_timer_result {
    STATUS_ERR, // 错误
    STATUS_OK, // 正常
    STATUS_TASK_MAXIMUM, // 任务数量超过最大值
    STATUS_TASK_FUNC_NULL, // 运行函数体为空
    STATUS_TASK_ID_ERR, // 任务ID错误
    STATUS_TASK_DELETED_RESUME, // 删除正在运行任务
    STATUS_MAX,
};

// 定义任务标志位枚举
enum os_task_flag {
    TASK_FLAG_INIT, // 默认值
    TASK_FLAG_READY, // 任务就绪
    TASK_FLAG_SUSPEND, // 任务挂起
    TASK_FLAG_EXECUTE, // 任务执行
    TASK_FLAG_EXIT, // 任务退出
    TASK_FLAG_MAX,
};

// 定义定时器超时状态枚举
enum os_tasktimeout {
    TIMER_NOT_OVERTIME, // 定时器未超时
    TIMER_OVERTIME, // 定时器超时
};

// 定义任务属性结构体
struct os_task_attr {
    uint8_t task_id; // 任务id，用于退出任务
    enum os_task_flag task_flag; // 任务标记
    enum task_timer_type timer_type; // 定时器类型
    enum os_task_timer_result task_result; // 任务状态
    uint8_t *params; // 任务参数
    int32_t timeout; // 任务超时，非周期任务置0
    int32_t timeout_reload; // 任务超时重新加载值
    enum os_task_timeout overtime; // 定时器超时
    task_func_t task_enter_func; // 任务函数入口
    task_func_t task_callback_func; // 任务函数回调
};

// 获取已使用任务数
uint8_t os_task_used_count(void);
// 创建任务
struct os_task_attr *os_task_create(struct os_task_attr *task_attr, uint8_t priority);
// 删除任务
enum os_task_timer_result os_task_deleted(uint8_t task_id);
// 执行任务
void task_timer_execute(uint8_t index);
// 更新任务超时
void os_task_timeout_update(void);
// 设置任务超时
void os_task_timer_timeout_set(uint8_t index, int32_t timeout);
// 恢复任务
void os_task_timer_resume(uint8_t id);
// 挂起任务
void os_task_timer_suspend(uint8_t id);

#endif // _OS_TASK_TIMER_H_